package com.zhanghp.class026;


import java.util.HashMap;
import java.util.HashSet;

/**
 * @author zhanghp
 * @since 2024/3/27 15:07
 */
public class Code01_HashSetAndHashMap {

    // 引用类型，值比较 （Byte, Short,Integer, Long, Double, Float， String, Character, Boolean）
    // 对象类型，地址比较
    public static void main(String[] args) {
        // Byte, Short,Integer, Long, Double, Float
        // String, Character, Boolean 等都有这个特征
        String str1 = new String("hello");
        String str2 = new String("hello");
        // false 内存地址不同
        System.out.println(str1 == str2);
        // true 值相同
        System.out.println(str1.equals(str2));

        System.out.println("=========HashSet=========");

        HashSet<String> set = new HashSet<>();
        set.add(str1);
        // 值比较
        System.out.println(set.contains("hello"));
        // 值比较
        System.out.println(set.contains(str2));
        set.add(str2);
        // 值相同，不重复添加
        System.out.println(set.size());
        set.remove("hello");
        System.out.println(set.size());
        set.add(str1);
        set.remove(str1);
        System.out.println(set.size());
        set.clear();
        System.out.println(set.isEmpty());

        System.out.println("=========HashMap=========");
        HashMap<String, String> map = new HashMap<>();
        map.put(str1, "world");
        // true 值比较
        System.out.println(map.containsKey("hello"));
        // true 值比较
        System.out.println(map.containsKey(str2));
        // world 通过值匹配val
        System.out.println(map.get(str2));
        // true
        System.out.println(map.get("你好") == null);
        map.remove("hello");
        // 0
        System.out.println(map.size());
        map.clear();
        // true
        System.out.println(map.isEmpty());

        System.out.println("===========");

        // 一般在笔试中，未必需要申请哈希表
        HashMap<Integer, Integer> map2 = new HashMap<>();
        map2.put(56, 7285);
        map2.put(34, 3671263);
        map2.put(17, 716311);
        map2.put(24, 1263161);
        // 上面的map2行为，可以被如下数组的行为替代
        int[] arr = new int[100];
        arr[56] = 7285;
        arr[34] = 3671263;
        arr[17] = 716311;
        arr[24] = 1263161;
        // 哈希表的增、删、改、查，都可以被数组替代，前提是key的范围是固定的、可控的
        System.out.println("在笔试场合中哈希表往往会被数组替代");

        System.out.println("===========");

        Student s1 = new Student(17, "张三");
        Student s2 = new Student(17, "张三");
        HashMap<Student, String> map3 = new HashMap<>();
        map3.put(s1, "这是张三");
        // true 内存地址比较
        System.out.println(map3.containsKey(s1));
        // false 内存地址比较
        System.out.println(map3.containsKey(s2));
        map3.put(s2,"这是另外一个张三");
        // 2
        System.out.println(map3.size());
        // 这是张三
        System.out.println(map3.get(s1));
        // 这是另外一个张三
        System.out.println(map3.get(s2));
    }

    public static class Student {
        public int age;
        public String name;

        public Student(int a, String b) {
            age = a;
            name = b;
        }
    }
}
